#include "common_inc.h"
#include "led.h"
#include "uart.h"
#include "tmc5130.h"

/**
  * @brief  应用程序入口函数
  * @param  None
  * @retval None
  */
void AppMain(void)
{
    /* 初始化LED */
    LED_Init();

    // /* 初始化串口，波特率115200 */
    // uart_init(115200);

    /* TMC5130初始化 */
    TMC5130_GPIO_Config();

    /* 等待100ms让SPI稳定，非常重要！
       TMC的SPI初始化完毕后，写寄存器之前，必须要稍作等待，
       否则第一个寄存器大部分时候会写入数据异常，导致电机不能运动！ */
    HAL_Delay(100);

    /* 配置TMC5130基本参数 */
    TMC5130_CHOPCONF_Init(3, 4, 1, 2, 16);     /* 16细分，细分可根据实际需求更改 */
    TMC5130_IHOLD_IRUN_Init(4, 4, 8);          /* 设置电机的保持电流、运行电流、降电流的周期数 */

    /* 配置电机运动参数
       不同电机、不同负载，需要仔细调整这些参数，以便让电机运行得更加顺畅
       VSTART: 启动速度
       A1: 第一段加速度
       V1: 第一段速度
       AMAX: 最大加速度
       VMAX: 最大速度
       DMAX: 最大减速度
       D1: 第一段减速度
       VSTOP: 停止速度 */
    TMC5130_WriteInt(TMC5130_VSTART, 100);     /* 启动速度=100 */
    TMC5130_WriteInt(TMC5130_A1, 500);         /* 加速度A1=500 */
    TMC5130_WriteInt(TMC5130_V1, 50000);       /* 转折速度V1=50000 */
    TMC5130_WriteInt(TMC5130_AMAX, 1000);      /* 最大加速度AMAX=1000 */
    TMC5130_WriteInt(TMC5130_VMAX, 200000);    /* 最大速度VMAX=200000 */
    TMC5130_WriteInt(TMC5130_DMAX, 700);       /* 最大减速度DMAX=700 */
    TMC5130_WriteInt(TMC5130_D1, 1400);        /* 转折减速度D1=1400 */
    TMC5130_WriteInt(TMC5130_VSTOP, 10);       /* 停止速度VSTOP=10 */

    printf("TMC5130 INIT OK!\r\n\r\n");

    while(1)
    {
        /* 运动到32000位置（在16细分时相当于10圈） */
        LED_Off();
        TMC5130_WriteInt(TMC5130_XTARGET, 32000);
        HAL_Delay(3600);  /* 等待电机运动完成 */
        printf("TMC5130_XACTUAL: %ld\r\n", TMC5130_ReadInt(TMC5130_XACTUAL));

        /* 返回原点 */
        LED_On();
        TMC5130_WriteInt(TMC5130_XTARGET, 0);
        HAL_Delay(3600);  /* 等待电机运动完成 */
        printf("TMC5130_XACTUAL: %ld\r\n", TMC5130_ReadInt(TMC5130_XACTUAL));
    }
}
